/*
 * ExchangeTagEntity类，该类的主要功能是作为交换信号的实体类，执行观察者模式，并且出现某个交换信号时进行计算
 * 对应的所有测点进行计算，该类对象在ExchangeScanner里被集中构造，放在QMap<QString, ExchangeTagEntity*>里
 *
 * FIELDS:
 *     database connection:
 *        1. threadSqliteConnection(QSqlDatabase)    从ExchangeScanner传递过来的sqlite连接
 *        2. threadSqlServerConnection(QSqlDatabase)        从ExchangeScanner传递过来的sql server连接
 *
 *     exchange tag infomation:    不特殊，不标注了，对应数据库schema
 *        1. int exchangeTagId;
 *        2. QString exchangeTagName;
 *        3. QString exchangeTagTag;
 *        4. QString exchangeTagDesc;
 *        5. double real;
 *
 *     others:
 *        1. temperatureMeasuringTagList(QList<TemperatureMeasuringTagEntity*>)
 *        2. temperatureMeasuringTagCodeList(QList<QString>)
 *        p.s. 这两个结构本意是想用来记录哪些温度测点属于当前这个交换信号，然后将查询出来的结果赋值给这两个结构
 *              但是目前觉得好像并不需要，如果记录进入list，再遍历挨个获取，时间和空间都开销更大，所以优化掉
 *
 * MEMBER FUNCTIONS:
 *
 *        getters & setters    不特殊说明了
 *        void realChanged();    这个函数有点特殊，是不是real对应的同名changed函数，作为slots还能属于同一个thread
 *                                          这个回头再详细深究一下源码。
*/

#ifndef EXCHANGETAGENTITY_H
#define EXCHANGETAGENTITY_H

#include <QObject>
#include <QSqlDatabase>
#include "temperaturemeasuringtagentity.h"

class ExchangeTagEntity : public QObject
{
    Q_OBJECT
public:
    explicit ExchangeTagEntity(QObject *parent = nullptr);

    /*传指针？*/
    explicit ExchangeTagEntity(QObject *parent = nullptr, int tempExchangeTagId = 0,
                               QString tempExchangeTagName = "", QString tempExchangeTagTag = "",
                               QString tempExchangeTagDesc = "", double tempReal = 0.0,
                               const QSqlDatabase * sqliteConnection = nullptr, const QSqlDatabase *
                               sqlServerConnection = nullptr);

    int getExchangeTagId() const;
    void setExchangeTagId(int newExchangeTagId);

    const QString &getExchangeTagName() const;
    void setExchangeTagName(const QString &newExchangeTagName);

    const QString &getExchangeTagTag() const;
    void setExchangeTagTag(const QString &newExchangeTagTag);

    const QString &getExchangeTagDesc() const;
    void setExchangeTagDesc(const QString &newExchangeTagDesc);

    double getReal() const;
    void setReal(double newReal);

signals:
    /*
     * 这里要添加自定义signal了，类似vue的watch，而且要加入slot
     * 备注：
     * 这个信号应该发给存在线程的类，并且暂停当前线程，计算结束之后，应该恢复当前线程
    */
//    void realValueChangeToOne(double newReal);



public slots:
    /*
     * 这里要加入槽函数，槽函数是接收到参数之后的操作
    */
    void realChanged();

private:
    int exchangeTagId;
    QString exchangeTagName;
    QString exchangeTagTag;
    QString exchangeTagDesc;
    double real;

    const QSqlDatabase threadSqliteConnection;
    const QSqlDatabase threadSqlServerConnection;

    /*
     * 列表，携带测温点的信息，这个测温点是指当前这个交换信号从属的测温点
     * 并且只有在这个信号被触发的时候才建立，要注意，所以每次计算之后，要
     * 清空这个测温点列表
    */
    QList<TemperatureMeasuringTagEntity*> temperatureMeasuringTagList;
    QList<QString> temperatureMeasuringTagCodeList;

};

#endif // EXCHANGETAGENTITY_H
